Spring JDBC এবং Stored Procedures

Java Technologies - স্প্রিং জেডিবিসি (Spring JDBC)
106
106

স্প্রিং জেডিবিসি ব্যবহার করে ডাটাবেসের Stored Procedures এবং Stored Functions-এ সহজেই অ্যাক্সেস করা যায়। স্প্রিং এই কাজের জন্য বিশেষ SimpleJdbcCall ক্লাস সরবরাহ করে, যা Stored Procedure বা Function কল করার জন্য একটি সরল এবং ফ্লেক্সিবল উপায় প্রদান করে।


Stored Procedure কি?

  • Stored Procedure হলো ডাটাবেসে সংরক্ষিত এক বা একাধিক SQL স্টেটমেন্টের একটি সেট, যা নির্দিষ্ট নামের মাধ্যমে কল করা যায়।
  • এটি পুনর্ব্যবহারযোগ্য, পারফরম্যান্স উন্নত করে এবং ডাটাবেসের মধ্যে লজিক রাখতে সাহায্য করে।

Spring JDBC এবং Stored Procedure এর ব্যবহার

Spring JDBC এর মাধ্যমে Stored Procedure-এ ইনপুট প্যারামিটার প্রদান করা, আউটপুট প্যারামিটার গ্রহণ করা এবং তাদের ব্যবহার সহজ।


উদাহরণসহ Stored Procedure ব্যবহারের ধাপ

১. Stored Procedure তৈরি করা

একটি MySQL ডাটাবেসে একটি উদাহরণ Stored Procedure তৈরি করা হলো:

DELIMITER //

CREATE PROCEDURE GetStudentById(IN studentId INT, OUT studentName VARCHAR(50))
BEGIN
    SELECT name INTO studentName FROM students WHERE id = studentId;
END //

DELIMITER ;

এখানে:

  • studentId হলো ইনপুট প্যারামিটার।
  • studentName হলো আউটপুট প্যারামিটার।

২. Spring JDBC Configuration

Spring এর কনফিগারেশন ক্লাসে JdbcTemplate এবং DataSource কনফিগার করা হবে।

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("user");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

৩. Stored Procedure কল করা

SimpleJdbcCall ব্যবহার:
@Service
public class StudentService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public String getStudentNameById(int id) {
        SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("GetStudentById")
            .declareParameters(
                new SqlParameter("studentId", Types.INTEGER),  // Input parameter
                new SqlOutParameter("studentName", Types.VARCHAR)  // Output parameter
            );

        // প্যারামিটার ম্যাপিং
        Map<String, Object> inputParams = new HashMap<>();
        inputParams.put("studentId", id);

        // Execute the procedure
        Map<String, Object> outParams = simpleJdbcCall.execute(inputParams);

        // Output parameter থেকে ডাটা রিটার্ন
        return (String) outParams.get("studentName");
    }
}

৪. Controller বা Main Method

Service ক্লাস থেকে Stored Procedure কল করা:

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    StudentService studentService = context.getBean(StudentService.class);

    String studentName = studentService.getStudentNameById(1);
    System.out.println("Student Name: " + studentName);
}

ইনপুট এবং আউটপুট প্যারামিটার সহ Stored Procedure

Stored Procedure-এ একাধিক ইনপুট এবং আউটপুট প্যারামিটার থাকলে সেগুলো SimpleJdbcCall এ ম্যাপ করা হয়।

উদাহরণ:

DELIMITER //

CREATE PROCEDURE UpdateStudentGrade(IN studentId INT, IN newGrade VARCHAR(10), OUT successMessage VARCHAR(50))
BEGIN
    UPDATE students SET grade = newGrade WHERE id = studentId;
    SET successMessage = CONCAT('Grade updated for student ID ', studentId);
END //

DELIMITER ;
Java Implementation:
public String updateStudentGrade(int id, String grade) {
    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
        .withProcedureName("UpdateStudentGrade")
        .declareParameters(
            new SqlParameter("studentId", Types.INTEGER),
            new SqlParameter("newGrade", Types.VARCHAR),
            new SqlOutParameter("successMessage", Types.VARCHAR)
        );

    Map<String, Object> inputParams = new HashMap<>();
    inputParams.put("studentId", id);
    inputParams.put("newGrade", grade);

    Map<String, Object> outParams = simpleJdbcCall.execute(inputParams);

    return (String) outParams.get("successMessage");
}

আউটপুট প্যারামিটার ছাড়া Stored Procedure কল করা

যদি Stored Procedure শুধু ডাটা মডিফাই করে এবং কোনো আউটপুট প্যারামিটার রিটার্ন না করে, তাহলে execute ব্যবহার করা যেতে পারে।

public void deleteStudentById(int id) {
    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
        .withProcedureName("DeleteStudent");

    Map<String, Object> inputParams = new HashMap<>();
    inputParams.put("studentId", id);

    simpleJdbcCall.execute(inputParams);
    System.out.println("Student deleted successfully.");
}

সুবিধা:

  1. বিল্ট-ইন ক্লাস: SimpleJdbcCall ব্যবহার করে Stored Procedure কে সহজে কল করা যায়।
  2. Parameter Mapping: ইনপুট এবং আউটপুট প্যারামিটার সহজেই ম্যাপ করা যায়।
  3. Reusable Code: একবার কনফিগার করলে পুনরায় ব্যবহার করা যায়।
  4. Error Handling: স্প্রিং এর DataAccessException এর মাধ্যমে সহজেই এক্সসেপশন হ্যান্ডল করা যায়।

সংক্ষেপে

Spring JDBC-তে Stored Procedure এর ব্যবহার ডেভেলপারদের জন্য খুবই সুবিধাজনক এবং শক্তিশালী। SimpleJdbcCall ক্লাস এই প্রক্রিয়াটিকে সহজ করে এবং ডাটাবেসের সাথে মডিউলার ও পুনর্ব্যবহারযোগ্য সমাধান তৈরি করতে সাহায্য করে।

Content added By

Stored Procedure কি এবং কেন এটি প্রয়োজনীয়?

83
83

Stored Procedure হল একটি প্রি-কোম্পাইলড SQL স্টেটমেন্ট বা SQL কোডের একটি গ্রুপ যা ডেটাবেস সার্ভারের মধ্যে সংরক্ষিত থাকে এবং তখন ডেটাবেসে কোন অপারেশন সম্পাদন করতে ব্যবহার করা হয়। এটি একটি সি, জাভা, পিএইচপি ইত্যাদি প্রোগ্রামিং ভাষায় লেখা ফাংশনের মতো, তবে এটি ডেটাবেসে সংরক্ষিত থাকে এবং SQL কোয়েরি সমূহের একটি গ্রুপ থাকে যা পুনরায় একাধিক বার ব্যবহার করা যায়।

একটি Stored Procedure ডেটাবেসে সংরক্ষিত থাকে এবং ক্লায়েন্ট অ্যাপ্লিকেশন থেকে কল করা হয়। এটি ডেটাবেস সার্ভার দ্বারা এক্সিকিউট হয় এবং নির্দিষ্ট কাজ সম্পাদন করে, যেমন:

  • ডেটা ইনসার্ট, আপডেট বা ডিলিট করা
  • জটিল লগিক সম্পাদন করা
  • ডেটাবেস রিসোর্স ম্যানেজমেন্ট

Stored Procedure এর বৈশিষ্ট্য:

  1. প্রি-কোম্পাইলড কোড: এটি ডেটাবেসে সংরক্ষিত থাকে এবং প্রি-কোম্পাইলড হওয়ায় দ্রুত এক্সিকিউট করা যায়।
  2. নিরাপত্তা: Stored Procedure এর মাধ্যমে ডেটাবেসের সাথে নিরাপদ যোগাযোগ করা যায়, কারণ ক্লায়েন্ট অ্যাপ্লিকেশন সরাসরি SQL কোড অ্যাক্সেস করতে পারে না।
  3. পুনঃব্যবহারযোগ্যতা: একবার তৈরি করা হলে এটি বারবার ব্যবহার করা যেতে পারে, যা কোড রিরিটিং কমিয়ে দেয়।
  4. ডেটাবেস লজিক: এটি ডেটাবেস লজিক এবং বিজনেস লজিককে একত্রিত করে, ডেটাবেসের মধ্যে জটিল প্রসেসিং করতে সক্ষম হয়।
  5. পফরম্যান্স উন্নয়ন: প্রি-কোম্পাইলড হওয়ায় ডেটাবেস এক্সিকিউশনের গতির উন্নতি ঘটতে পারে।

Stored Procedure এর প্রয়োগের কারণ:

১. পফরম্যান্স উন্নয়ন:

  • Stored Procedure প্রি-কোম্পাইলড এবং অপটিমাইজড হওয়ায় এটি সাধারণ SQL কোয়েরির তুলনায় দ্রুত কার্যকরী হতে পারে। এতে নেটওয়ার্ক রাউন্ড ট্রিপ কমে এবং কর্মক্ষমতা বৃদ্ধি পায়।

২. নিরাপত্তা:

  • Stored Procedure ব্যবহার করলে আপনি SQL ইনজেকশন আক্রমণ থেকে সুরক্ষিত থাকতে পারেন, কারণ প্রোগ্রামটি SQL কোড তৈরি করার পরিবর্তে স্টোরড প্রসিডিওর কল করে। ব্যবহারকারী সরাসরি SQL কোডে প্রবেশ করতে পারে না।

৩. কোড রক্ষণাবেক্ষণ এবং পুনঃব্যবহারযোগ্যতা:

  • একবার Stored Procedure তৈরি হলে এটি বারবার ব্যবহার করা যেতে পারে, ফলে কোড পুনরায় লেখা বা কপি পেস্ট করার প্রয়োজন হয় না।
  • Stored Procedure তে পরিবর্তন করলে এটি ডেটাবেসে পরিবর্তিত হবে এবং ক্লায়েন্ট অ্যাপ্লিকেশনে কোন পরিবর্তন করার প্রয়োজন নেই।

৪. বিজনেস লজিক ডেটাবেসে স্থানান্তর:

  • কখনও কখনও, বিশেষত যখন জটিল বিজনেস লজিক বা ক্যালকুলেশন দরকার, তা ডেটাবেস স্তরে স্থাপন করা ভাল হতে পারে। এটি ডেটাবেস সার্ভারে প্রক্রিয়া করা হয়, যা অ্যাপ্লিকেশন থেকে আলাদা এবং স্কেলেবিলিটি বৃদ্ধি পায়।

৫. কন্ট্রোল এবং ডিবাগিং সহজ করা:

  • ডেটাবেসে সংরক্ষিত থাকা এই কোডটি অ্যাপ্লিকেশনের কোড থেকে আলাদা থাকে, এবং এটি সাধারণত সহজে ডিবাগ এবং টেস্ট করা যায়।

Spring JDBC তে Stored Procedure কল করা:

স্প্রিং জেডিবিসি তে Stored Procedure কল করতে SimpleJdbcCall ক্লাস ব্যবহার করা হয়। এটি সহজে এবং কার্যকরভাবে স্টোরড প্রসিডিওর কল করতে সহায়ক।

উদাহরণ:

ধরা যাক, আমাদের একটি স্টোরড প্রসিডিওর রয়েছে যেটি একটি Employee টেবিল থেকে কোনো নির্দিষ্ট id এর কর্মচারীর ডেটা রিটার্ন করবে।

  1. Stored Procedure SQL:

    CREATE PROCEDURE GetEmployeeById(IN empId INT)
    BEGIN
        SELECT * FROM Employee WHERE id = empId;
    END;
    
  2. Spring JDBC তে Stored Procedure কল করার কোড:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.simple.SimpleJdbcCall;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Component;
    import java.util.Map;
    
    @Component
    public class EmployeeDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        // Method to call stored procedure and get employee by ID
        public Employee getEmployeeById(int empId) {
            SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("GetEmployeeById")
                .returningResultSet("result", new BeanPropertyRowMapper<>(Employee.class));
    
            // Call stored procedure with input parameter
            Map<String, Object> result = jdbcCall.execute(empId);
            return (Employee) result.get("result");
        }
    }
    

ব্যাখ্যা:

  • এখানে SimpleJdbcCall ব্যবহার করা হয়েছে GetEmployeeById স্টোরড প্রসিডিওর কল করার জন্য।
  • .withProcedureName("GetEmployeeById") দ্বারা আমরা স্টোরড প্রসিডিওরের নাম নির্দিষ্ট করি।
  • .returningResultSet("result", new BeanPropertyRowMapper<>(Employee.class)) এর মাধ্যমে ডেটাবেস থেকে রিটার্ন হওয়া রেজাল্ট ম্যানেজ করা হচ্ছে।

উপসংহার:

Stored Procedures ডেটাবেসে জটিল ক্যালকুলেশন এবং অপারেশনগুলো সংরক্ষণ করতে সাহায্য করে, যা কর্মক্ষমতা, নিরাপত্তা এবং রক্ষণাবেক্ষণকে উন্নত করে। এটি ডেটাবেস লজিক এবং বিজনেস লজিককে একত্রিত করে এবং কোডের পুনরায় ব্যবহারযোগ্যতা বাড়ায়। স্প্রিং জেডিবিসি তে Stored Procedures কল করতে SimpleJdbcCall ব্যবহার করা হয়, যা স্টোরড প্রসিডিওর কলের প্রক্রিয়াটি সহজ এবং কার্যকরী করে তোলে।

Content added By

JdbcTemplate দিয়ে Stored Procedure কল করা

89
89

Spring JDBC-এ JdbcTemplate ব্যবহার করে Stored Procedure কল করা একটি সাধারণ এবং কার্যকর পদ্ধতি। Stored Procedure হল ডেটাবেসের মধ্যে সংরক্ষিত একটি প্রি-কম্পাইল্ড SQL কুয়েরি বা গ্রুপ অফ কুয়েরি, যা বিশেষভাবে ডেটাবেসের কার্যক্রম দক্ষতার সাথে সম্পাদন করার জন্য তৈরি করা হয়। Spring JDBC-এ JdbcTemplate ব্যবহার করে Stored Procedure কল করার জন্য দুটি মূল পদ্ধতি রয়েছে:

  1. CallableStatementCreator এবং CallableStatementCallback ব্যবহার করা।
  2. SimpleJdbcCall ক্লাস ব্যবহার করা (এটি Spring 3.0 এর পর থেকে সুপারিশকৃত পদ্ধতি, যা Stored Procedure কল করতে অনেক সহজ ও পরিষ্কার করে)।

এখানে দুটি পদ্ধতির বিস্তারিত আলোচনা করা হলো।

1. JdbcTemplate দিয়ে Stored Procedure কল করা (CallableStatementCreator & CallableStatementCallback)

এটি Spring JDBC-এর মূল API-তে একে অপরের সাথে কাজ করার জন্য দুটি ক্লাস CallableStatementCreator এবং CallableStatementCallback ব্যবহার করে।

উদাহরণ:

import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.CallableStatement;
import java.sql.SQLException;

public class JdbcTemplateStoredProcedureExample {

    private JdbcTemplate jdbcTemplate;

    public JdbcTemplateStoredProcedureExample(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public void callStoredProcedure() {
        String procedureCall = "{call my_stored_procedure(?, ?)}"; // Stored procedure এর কল

        // Stored procedure কল করার জন্য CallableStatementCreator তৈরি
        CallableStatementCreator csc = conn -> {
            CallableStatement cs = conn.prepareCall(procedureCall);
            cs.setInt(1, 10); // প্রথম প্যারামিটার প্রদান
            cs.setString(2, "example"); // দ্বিতীয় প্যারামিটার প্রদান
            return cs;
        };

        // CallableStatementCallback ব্যবহার করে Stored Procedure কল
        jdbcTemplate.execute(csc, (CallableStatement cs) -> {
            cs.execute(); // Stored Procedure এক্সিকিউট করা
            return null;
        });
    }
}

এখানে:

  • CallableStatementCreator একটি CallableStatement তৈরি করে যেটি Stored Procedure কল করার জন্য ব্যবহৃত হবে।
  • CallableStatementCallback কলব্যাক হ্যান্ডলার যা Stored Procedure এক্সিকিউট করার জন্য ব্যবহৃত হয়।

2. SimpleJdbcCall দিয়ে Stored Procedure কল করা

Spring 3.0 এর পর থেকে SimpleJdbcCall ক্লাসটি Stored Procedure কল করার জন্য একটি সহজ এবং পরিষ্কার পদ্ধতি প্রদান করে। এটি JdbcTemplate থেকে সহজে আলাদা করা যেতে পারে এবং আপনার কোড আরও পরিষ্কার এবং সংক্ষিপ্ত হতে পারে।

উদাহরণ:

import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlReturnResultSet;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import javax.sql.DataSource;
import java.sql.Types;
import java.util.Map;

public class SimpleJdbcCallExample {

    private SimpleJdbcCall simpleJdbcCall;

    public SimpleJdbcCallExample(DataSource dataSource) {
        this.simpleJdbcCall = new SimpleJdbcCall(dataSource)
                                    .withProcedureName("my_stored_procedure") // Stored Procedure নাম
                                    .declareParameters(
                                        new SqlParameter("param1", Types.INTEGER), // প্যারামিটার ১
                                        new SqlParameter("param2", Types.VARCHAR)  // প্যারামিটার ২
                                    );
    }

    public void callStoredProcedure() {
        // প্যারামিটার প্রদান
        Map<String, Object> inParams = Map.of(
            "param1", 10,
            "param2", "example"
        );

        // Stored Procedure কল করা এবং আউটপুট প্রাপ্তি
        Map<String, Object> result = simpleJdbcCall.execute(inParams);

        // আউটপুট দেখানো
        System.out.println("Result: " + result);
    }
}

এখানে:

  • SimpleJdbcCall ক্লাস ব্যবহার করা হচ্ছে, যা Stored Procedure কল করার জন্য একটি সহজ এবং সুসংহত পদ্ধতি।
  • withProcedureName দিয়ে Stored Procedure এর নাম প্রদান করা হয়েছে।
  • declareParameters ব্যবহার করে প্যারামিটারগুলো নির্ধারণ করা হচ্ছে।
  • execute মেথডের মাধ্যমে প্রক্রিয়াটি সম্পাদন করা হচ্ছে, এবং এটি আউটপুট (যদি থাকে) রিটার্ন করে।

Spring JDBC দিয়ে Stored Procedure কল করার সুবিধাসমূহ:

  1. সহজ API: SimpleJdbcCall ব্যবহার করে Stored Procedure কল করা অনেক সহজ এবং কোড সংক্ষিপ্ত করা যায়।
  2. পারফরম্যান্স: Stored Procedure ডেটাবেসের মধ্যে প্রি-কম্পাইলড এবং অপটিমাইজড হওয়ায় এটি অনেক দ্রুত হয় এবং সার্ভারের লোড কমাতে সাহায্য করে।
  3. নিরাপত্তা: SQL ইনজেকশন প্রতিরোধে সাহায্য করে, কারণ Stored Procedure তে প্যারামিটারাইজড কুয়েরি ব্যবহৃত হয়।
  4. ডেটাবেস নিরপেক্ষতা: Stored Procedure কল করে, আপনার কোড ডেটাবেস নিরপেক্ষ থাকে, কারণ সব ডেটাবেস অপারেশন ডেটাবেস স্তরের মধ্যে থাকে।

সংক্ষেপে:

Spring JDBC ব্যবহার করে Stored Procedure কল করা খুবই সহজ এবং প্রভাবশালী। JdbcTemplate এর মাধ্যমে আপনি CallableStatement ব্যবহার করে অথবা SimpleJdbcCall এর মাধ্যমে Stored Procedure কল করতে পারেন। SimpleJdbcCall নতুন এবং সুপারিশকৃত পদ্ধতি, যা কম কোড এবং উচ্চতর পঠনযোগ্যতা প্রদান করে।

Content added By

SimpleJdbcCall ব্যবহার করে Stored Procedure পরিচালনা

119
119

Spring JDBC-তে SimpleJdbcCall ব্যবহার করে ডেটাবেসের Stored Procedure কল করা সহজ এবং কার্যকর। এটি JDBC API-এর জটিলতা সরিয়ে একটি সিম্পল এবং ক্লিন এপিআই প্রদান করে, যা ইনপুট ও আউটপুট প্যারামিটার ম্যানেজ করার পাশাপাশি প্রয়োজনীয় SQL কুয়েরি অটোমেটিক জেনারেট করতে পারে।


SimpleJdbcCall কি?

SimpleJdbcCall হলো Spring JDBC-র একটি ক্লাস, যা Stored Procedure বা ফাংশন পরিচালনার জন্য ব্যবহার করা হয়। এটি Stored Procedure-এর ইনপুট এবং আউটপুট প্যারামিটারগুলোর জন্য অটোমেটিক মেটাডেটা রিট্রিভ করতে সক্ষম।


SimpleJdbcCall ব্যবহারের ধাপ

১. ডিপেন্ডেন্সি যোগ করা

Spring JDBC এবং ড্রাইভার ডিপেন্ডেন্সি প্রয়োজন।

Maven:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

২. ডেটাসোর্স কনফিগারেশন

Spring Framework বা Spring Boot ব্যবহার করে DataSource কনফিগার করুন।

Spring Boot (application.properties):

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Java Configuration (Spring Framework):

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
    dataSource.setUsername("root");
    dataSource.setPassword("password");
    return dataSource;
}

৩. Stored Procedure তৈরি করা

নিচের উদাহরণটি একটি MySQL Stored Procedure এর জন্য:

DELIMITER CREATEPROCEDUREGetUserById(INuserIdINT,OUTuserNameVARCHAR(50))BEGINSELECTnameINTOuserNameFROMusersWHEREid=userId;END

CREATE PROCEDURE GetUserById(IN userId INT, OUT userName VARCHAR(50))
BEGIN
    SELECT name INTO userName FROM users WHERE id = userId;
END

DELIMITER ;

৪. SimpleJdbcCall ব্যবহার করা

Spring JDBC-তে SimpleJdbcCall ব্যবহার করে Stored Procedure কল করতে পারেন।

উদাহরণ ১: ইনপুট এবং আউটপুট প্যারামিটার সহ Stored Procedure

@Service
public class UserService {

    private final SimpleJdbcCall simpleJdbcCall;

    @Autowired
    public UserService(JdbcTemplate jdbcTemplate) {
        this.simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
                                .withProcedureName("GetUserById");
    }

    public String getUserById(int userId) {
        // ইনপুট প্যারামিটার
        SqlParameterSource inParams = new MapSqlParameterSource()
                .addValue("userId", userId);

        // Stored Procedure কল করা এবং আউটপুট প্যারামিটার রিসিভ করা
        Map<String, Object> out = simpleJdbcCall.execute(inParams);

        return (String) out.get("userName");
    }
}

কোড ব্যাখ্যা:

  1. SimpleJdbcCall:
    • withProcedureName("GetUserById") দিয়ে Stored Procedure এর নাম উল্লেখ করা হয়।
  2. SqlParameterSource:
    • ইনপুট প্যারামিটার সেট করার জন্য ব্যবহৃত হয়।
  3. execute():
    • Stored Procedure চালায় এবং আউটপুট প্যারামিটার রিটার্ন করে।

উদাহরণ ২: শুধুমাত্র আউটপুট প্যারামিটার সহ Stored Procedure

public int getTotalUsers() {
    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                                .withProcedureName("GetTotalUsers")
                                .declareParameters(
                                    new SqlOutParameter("totalUsers", Types.INTEGER)
                                );

    Map<String, Object> out = jdbcCall.execute();

    return (Integer) out.get("totalUsers");
}

উদাহরণ ৩: Multiple Input এবং Output প্যারামিটার সহ Stored Procedure

Stored Procedure:

DELIMITER CREATEPROCEDUREUpdateUserEmail(INuserIdINT,INnewEmailVARCHAR(100),OUTstatusMessageVARCHAR(100))BEGINUPDATEusersSETemail=newEmailWHEREid=userId;SETstatusMessage='UpdateSuccessful';END

CREATE PROCEDURE UpdateUserEmail(
    IN userId INT, 
    IN newEmail VARCHAR(100), 
    OUT statusMessage VARCHAR(100)
)
BEGIN
    UPDATE users SET email = newEmail WHERE id = userId;
    SET statusMessage = 'Update Successful';
END

DELIMITER ;

Spring JDBC Implementation:

public String updateUserEmail(int userId, String newEmail) {
    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                                .withProcedureName("UpdateUserEmail");

    SqlParameterSource inParams = new MapSqlParameterSource()
            .addValue("userId", userId)
            .addValue("newEmail", newEmail);

    Map<String, Object> out = jdbcCall.execute(inParams);

    return (String) out.get("statusMessage");
}

উপকারিতা

  1. অটোমেটিক মেটাডেটা: Stored Procedure-এর প্যারামিটার ডাইনামিক্যালি রিট্রিভ করা যায়।
  2. কোড সিম্পলিফিকেশন: কম কোডে জটিল Stored Procedure হ্যান্ডল করা যায়।
  3. Reusable Component: SimpleJdbcCall একবার কনফিগার করলে বারবার ব্যবহার করা যায়।
  4. কাস্টমাইজেশন: ইনপুট এবং আউটপুট প্যারামিটার ম্যানেজ করার ক্ষমতা।

সীমাবদ্ধতা

  1. ডিপেন্ডেন্সি: স্প্রিং ফ্রেমওয়ার্কের ওপর নির্ভরশীল।
  2. কমপ্লেক্স Stored Procedure: জটিল লজিক ব্যবস্থাপনার জন্য অতিরিক্ত কাস্টমাইজেশন প্রয়োজন হতে পারে।

উপসংহার

Spring JDBC-তে SimpleJdbcCall ব্যবহার করে Stored Procedure হ্যান্ডল করা সহজ, কার্যকর এবং রিডেবল। এটি ইনপুট ও আউটপুট প্যারামিটার ব্যবস্থাপনার কাজকে অনেকটাই সরল করে। ছোট থেকে মাঝারি প্রজেক্টের জন্য এটি অত্যন্ত উপযোগী।

Content added By

উদাহরণ সহ Stored Procedures এর ব্যবহার

79
79

Spring JDBC-তে Stored Procedures ব্যবহার করার মাধ্যমে আপনি ডেটাবেসে সংরক্ষিত পদ্ধতিগুলি (যা ডেটাবেস সার্ভারে সংরক্ষিত থাকে) কল করতে পারেন। এটি বিশেষত যখন ডেটাবেসের মধ্যে জটিল লজিক বা কোড থাকে এবং আপনি সেই লজিকগুলো অ্যাপ্লিকেশন লেভেলে না লিখে সরাসরি ডেটাবেস থেকে ব্যবহার করতে চান, তখন কার্যকর।

Spring JDBC-তে Stored Procedure কল করার জন্য JdbcTemplate বা SimpleJdbcCall ব্যবহার করা হয়। এখানে আমরা SimpleJdbcCall এর মাধ্যমে Stored Procedure ব্যবহার করার উদাহরণ দেখব।

Step 1: application.properties ফাইলে ডেটাবেস কনফিগারেশন

প্রথমে, application.properties ফাইলে ডেটাবেস কনফিগারেশন করতে হবে:

# DataSource Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Step 2: Stored Procedure তৈরি করুন (ডেটাবেসে)

ধরা যাক, আমরা একটি Stored Procedure তৈরি করতে যাচ্ছি যা একটি কর্মীর তথ্য খুঁজে বের করবে তার আইডি দিয়ে। MySQL এ উদাহরণ:

DELIMITER CREATEPROCEDUREgetEmployeeDetails(INempIdINT)BEGINSELECTid,name,salaryFROMemployeeWHEREid=empId;END

CREATE PROCEDURE getEmployeeDetails (IN empId INT)
BEGIN
    SELECT id, name, salary
    FROM employee
    WHERE id = empId;
END

DELIMITER ;

এই Stored Procedure এর মাধ্যমে employee টেবিল থেকে নির্দিষ্ট id এর কর্মীর বিস্তারিত তথ্য পাওয়া যাবে।

Step 3: Spring JDBC এর মাধ্যমে Stored Procedure কল করা

Spring JDBC-তে Stored Procedure কল করার জন্য SimpleJdbcCall ব্যবহার করা হয়, যা ডেটাবেসের Stored Procedure কল করার প্রক্রিয়াকে সরল করে দেয়।

import org.springframework.jdbc.core.SimpleJdbcCall;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.util.Map;

@Repository
public class EmployeeRepository {

    private SimpleJdbcCall simpleJdbcCall;

    // Constructor injection for DataSource
    public EmployeeRepository(DataSource dataSource) {
        this.simpleJdbcCall = new SimpleJdbcCall(dataSource)
            .withProcedureName("getEmployeeDetails");  // Stored Procedure Name
    }

    public Map<String, Object> getEmployeeDetails(int empId) {
        // Create input parameter map
        Map<String, Object> inParams = Map.of("empId", empId);

        // Execute stored procedure and get the result
        Map<String, Object> result = simpleJdbcCall.execute(inParams);

        return result;
    }
}

Step 4: Service Layer এ Stored Procedure কল করুন

এখন EmployeeService ক্লাসে getEmployeeDetails মেথডটি কল করুন:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class EmployeeService {

    private final EmployeeRepository employeeRepository;

    @Autowired
    public EmployeeService(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
    }

    public Map<String, Object> getEmployeeDetails(int empId) {
        return employeeRepository.getEmployeeDetails(empId);
    }
}

Step 5: Controller তৈরি করুন (Optional)

Spring MVC Controller তৈরি করে ওয়েব রেসপন্স এ getEmployeeDetails মেথড কল করতে পারেন:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class EmployeeController {

    private final EmployeeService employeeService;

    @Autowired
    public EmployeeController(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @GetMapping("/employee/details")
    public Map<String, Object> getEmployeeDetails(@RequestParam int empId) {
        return employeeService.getEmployeeDetails(empId);
    }
}

এখন, আপনি GET /employee/details?empId=1 কল করে কর্মীর বিস্তারিত তথ্য পেতে পারবেন।


Step 6: Spring Boot Application রান করুন

এখন আপনি Spring Boot অ্যাপ্লিকেশনটি রান করতে পারেন এবং GET /employee/details?empId=1 এ গিয়ে Stored Procedure এর মাধ্যমে কর্মীর তথ্য পেতে পারবেন।


Stored Procedure কল করার সময় আরও কিছু গুরুত্বপূর্ণ বিষয়:

  1. আউটপুট হ্যান্ডলিং: যদি Stored Procedure থেকে আউটপুট আর্জি করা হয় (যেমন, আউটপুট প্যারামিটার বা রেজাল্ট সেট), SimpleJdbcCall তাতে ব্যবহৃত মানগুলিকে হ্যান্ডল করতে পারে। এই জন্য declareParameters বা returningResultSet মেথড ব্যবহার করা হয়।
  2. আউটপুট প্যারামিটার হ্যান্ডলিং: আউটপুট প্যারামিটার নিতে হলে SimpleJdbcCall এ আউটপুট প্যারামিটার ঘোষণা করতে হয়।

    উদাহরণ:

    simpleJdbcCall = new SimpleJdbcCall(dataSource)
            .withProcedureName("getEmployeeDetails")
            .declareParameters(new SqlOutParameter("outParam", Types.VARCHAR));
    
  3. স্টোরড প্রোসিডিউরের ইনপুট আর্গুমেন্ট: যখন আপনার স্টোরড প্রোসিডিউরে ইনপুট আর্গুমেন্ট থাকে, তখন আপনি সেগুলিকে Map এর মাধ্যমে পাস করেন, যেমন:

    Map<String, Object> inParams = Map.of("empId", empId);
    

Stored Procedure এর সুবিধা:

  1. কোড রিউজেবিলিটি: একবার ডেটাবেসে Stored Procedure তৈরি করার পর, সেটি বিভিন্ন অ্যাপ্লিকেশন থেকে ব্যবহার করা যায়, যা কোডের পুনরাবৃত্তি কমায়।
  2. পারফর্মেন্স বৃদ্ধি: Stored Procedure গুলি ডেটাবেসের মধ্যে সংরক্ষিত থাকে, তাই এগুলি কম্পাইল হওয়া এবং অপটিমাইজ করা থাকে, যা পারফর্মেন্স বৃদ্ধি করে।
  3. লজিক ইনক্যাপসুলেশন: ডেটাবেস লজিক অ্যাপ্লিকেশন থেকে আলাদা থাকে, যার ফলে অ্যাপ্লিকেশন কোড সহজ এবং পরিষ্কার হয়।
  4. ডেটাবেস নির্ভরতা: জটিল লজিক ডেটাবেসে সংরক্ষিত থাকলে, অ্যাপ্লিকেশন কোড কম জটিল হয় এবং সহজে মেইন্টেইন করা যায়।

Spring JDBC এর মাধ্যমে Stored Procedure ব্যবহারে আপনি ডেটাবেসের মধ্যে সংরক্ষিত লজিক সহজভাবে কল করতে পারেন, যা আপনার অ্যাপ্লিকেশনকে আরও কার্যকর এবং স্কেলেবল করে তোলে।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion